using System;
using System.Collections.Generic;
using System.Linq.Expressions;

namespace Nvigorate.Repository
{
    public interface IRepository<TRole>
        where TRole : class
    {
        void Delete<TModel, TProperty>(Expression<Func<TModel, TProperty>> property, TProperty id)
            where TModel : TRole;

        void Delete<TModel>(SearchCriteria<TModel> criteria)
            where TModel : TRole;

        IList<TRole> Find<TModel>(SearchCriteria<TModel> criteria)
            where TModel : TRole;

        IList<TRole> Find<TModel>(SearchCriteria<TModel> criteria, int page, int pageSize)
            where TModel : TRole;

        TRole FindOne<TModel>(SearchCriteria<TModel> criteria)
            where TModel : TRole;

        TRole Get<TModel, TProperty>(Expression<Func<TModel, TProperty>> property, TProperty id)
            where TModel : TRole;

        IList<TRole> GetAll<TModel>()
            where TModel : TRole;

        IList<TRole> GetAll<TModel>(int page, int pageSize)
            where TModel : TRole;

        int GetCount<TModel>(SearchCriteria<TModel> criteria)
            where TModel : TRole;

        int GetTotal<TModel>()
            where TModel : TRole;

        void Save<TModel>(TModel model)
            where TModel : TRole;

        void Save<TModel>(IEnumerable<TModel> models)
            where TModel : TRole;
    }
}